// //FileName :111.go
// //ime :2024/4/5 20:09
// //Author :syr030111
package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"strings"
)

// User 结构体定义
type User struct {
	Name   string `json:"name"`
	Passwd string `json:"passwd"`
	Age    string `json:"age"`
	Gender string `json:"gender"`
}

func main() {
	var users []User

	// 尝试从JSON文件中读取用户信息
	file, err := os.Open("users.json")
	//使用os.Open函数尝试打开名为"users.json"的文件，并返回文件句柄和可能的错误。
	if err != nil {
		if os.IsNotExist(err) {
			// 如果文件不存在，则创建空用户列表
			users = []User{}
		} else {
			panic(err)
		}
	} else {
		defer func(file *os.File) {
			//defer语句用于确保在函数返回之前执行特定的操作
			err := file.Close()
			if err != nil {

			}
		}(file)
		//用来确保文件在不再需要时被正确关闭，从而避免资源泄露
		decoder := json.NewDecoder(file)
		//创建一个新的JSON解码器，它使用文件句柄file作为输入源。
		err := decoder.Decode(&users)
		//使用解码器将文件内容解码为users变量，该变量应该是一个User类型的切片。
		if err != nil {
			panic(err)
		}
		//如果在解码过程中发生错误，则使用panic来终止程序并打印错误信息。
	}

	//键盘输入
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("登录请输入1，注册请输入0(输入q可退出): ")
	choice, _ := reader.ReadString('\n')
	choice = strings.TrimSpace(choice) // 去除首尾空白符

	if choice == "0" {

		for {
			fmt.Print("请输入注册用户名 (输入q退出): ")
			name, _ := reader.ReadString('\n')
			name = strings.TrimSpace(name)
			if name == "q" {
				break
			}

			// 检查用户名是否已存在
			exists := false
			for _, user := range users {
				if user.Name == name {
					fmt.Println("用户名已存在，请重新注册")
					exists = true
					break
				}
			}
			if exists {
				continue
			}

			// 接受输入的用户信息
			fmt.Print("请输入注册用户密码: ")
			passwd, _ := reader.ReadString('\n')
			passwd = strings.TrimSpace(passwd)
			fmt.Print("请输入注册用户年龄: ")
			age, _ := reader.ReadString('\n')
			age = strings.TrimSpace(age)
			fmt.Print("请输入注册用户性别: ")
			gender, _ := reader.ReadString('\n')
			gender = strings.TrimSpace(gender)

			// 创建一个新用户对象
			newUser := User{
				Name:   name,
				Passwd: passwd,
				Age:    age,
				Gender: gender,
			}

			// 添加到用户列表中
			users = append(users, newUser)
			fmt.Println("注册成功！")

			// 将更新后的用户信息写入JSON文件
			file, err := os.Create("users.json")
			if err != nil {
				fmt.Println("无法创建文件:", err)
				continue
			}
			defer func(file *os.File) {
				//同上
				err := file.Close()
				if err != nil {

				}
			}(file)
			encoder := json.NewEncoder(file)
			//创建了一个新的JSON编码器
			//它将使用file作为输出目标
			//json.NewEncoder函数返回一个*json.Encoder类型的值，该值包含了编码JSON数据到file所需的所有信息。
			if err := encoder.Encode(users); err != nil {
				fmt.Println("无法写入文件:", err)
				continue
			}

			// 询问用户是否继续注册
			fmt.Print("是否继续注册新用户？ (y/n): ")
			c, _ := reader.ReadString('\n')
			c = strings.TrimSpace(c)
			if c != "y" {
				break
			}
		}

	} else if choice == "1" {
		for {
			fmt.Print("请输入用户名: ")
			username, err := reader.ReadString('\n')
			if err != nil {
				fmt.Println("读取输入时出错:", err)
				continue
			}
			username = strings.TrimSpace(username)

			if username == "q" {
				break
			}

			var foundUser *User
			//这一行声明了一个名为foundUser的变量，其类型为指向User结构体的指针。
			for _, user := range users {
				if user.Name == username {
					foundUser = &user
					break
				}
			}

			if foundUser == nil {
				fmt.Println("用户名不存在，请重试或输入q退出")
				continue
			}

			fmt.Print("请输入密码: ")
			passwd, err := reader.ReadString('\n')
			if err != nil {
				fmt.Println("读取输入时出错:", err)
				continue
			}
			passwd = strings.TrimSpace(passwd)

			if passwd != foundUser.Passwd {
				fmt.Println("密码错误，请重试或输入q退出")
				continue
			}

			fmt.Println("登录成功！")
		}
	} else if choice == "q" {
		// 用户选择退出，不执行任何操作
	} else {
		fmt.Println("无效的选择，已退出")
	}

}

//// 将用户信息写入JSON文件
//func writeUsersToFile(users []User) error {
//	file, err := os.Create("users.json")
//	if err != nil {
//		return err
//	}
//	defer file.Close()
//	encoder := json.NewEncoder(file)
//	err = encoder.Encode(users)
//	if err != nil {
//		// 如果编码或写入出错，返回错误
//		return err
//	}
//	return nil
//}

